package com.yunyao.dao.service.bamu.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunyao.common.constant.enums.DataDeletedStatus;
import com.yunyao.common.core.BaseContext;
import com.yunyao.common.utils.RandomUtils;
import com.yunyao.dao.mapper.BamuContractMaterialMapper;
import com.yunyao.dao.mapper.BamuPurchaseContractMapper;
import com.yunyao.dao.model.BamuContractMaterial;
import com.yunyao.dao.model.BamuPurchaseContract;
import com.yunyao.dao.service.bamu.IBamuPurchaseContractService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 采购合同表 服务实现类
 * </p>
 *
 * @author xingjishuai
 * @since 2024-07-02
 */
@Service
public class BamuPurchaseContractServiceImpl extends ServiceImpl<BamuPurchaseContractMapper, BamuPurchaseContract> implements IBamuPurchaseContractService {
    @Resource
    private BamuContractMaterialMapper bamuContractMaterialMapper;
    /**
     * 根据合同编号获取采购合同
     * 此方法通过合同编号查询未被删除的采购合同信息
     *
     * @param purchaseContractNo 采购合同编号
     * @return 如果找到对应的采购合同，则返回BamuPurchaseContract对象；如果未找到或合同编号为空，则返回null
     */
    @Override
    public BamuPurchaseContract getByContractNo(String purchaseContractNo) {
        // 检查采购合同编号是否为空或空白，如果是，则返回null
        if (StringUtils.isBlank(purchaseContractNo)) {
            return null;
        }
        // 创建查询条件，用于查询合同编号和未被删除的采购合同
        LambdaQueryWrapper<BamuPurchaseContract> wrapper =
                new LambdaQueryWrapper<BamuPurchaseContract>()
                        .eq(BamuPurchaseContract::getContractNo, purchaseContractNo)
                        .eq(BamuPurchaseContract::getIsDeleted, DataDeletedStatus.NO.getType());
        // 根据查询条件获取采购合同信息
        return getOne(wrapper);
    }
    /**
     * 根据采购合同编号获取未删除的采购合同信息
     * 此方法用于查询指定采购合同编号的采购合同详细信息，只包括那些标记为未删除的记录
     *
     * @param purchaseContractNo 采购合同编号，用于唯一标识一个采购合同
     * @return 如果找到对应的采购合同且未被标记为删除，则返回BamuPurchaseContract对象，否则返回null
     */
    @Override
    public BamuPurchaseContract getByContractNonDeleted(String purchaseContractNo) {
        // 检查采购合同编号是否为空或空白，如果是，则返回null
        if (StringUtils.isBlank(purchaseContractNo)) {
            return null;
        }
        // 构建查询条件，用于精确匹配采购合同编号
        LambdaQueryWrapper<BamuPurchaseContract> wrapper =
                new LambdaQueryWrapper<BamuPurchaseContract>()
                        .eq(BamuPurchaseContract::getContractNo, purchaseContractNo);
        // 根据构建的查询条件，执行数据库查询，并返回查询到的采购合同对象
        return getOne(wrapper);
    }

    /**
     * 根据销售合同ID获取采购合同
     * 此方法通过销售合同的ID来查询并返回对应的采购合同信息如果销售合同ID为空或无效，则返回null
     *
     * @param saleContractId 销售合同的ID
     * @return 返回找到的采购合同对象，如果找不到或输入无效则返回null
     */
    @Override
    public BamuPurchaseContract getBySaleContractId(String saleContractId) {
        // 检查销售合同ID是否为空或仅包含空白字符，如果是，则返回null
        if (StringUtils.isBlank(saleContractId)) {
            return null;
        }

        // 构建查询条件，寻找销售合同ID和是否被删除的状态符合要求的采购合同
        LambdaQueryWrapper<BamuPurchaseContract> wrapper =
                new LambdaQueryWrapper<BamuPurchaseContract>()
                        .eq(BamuPurchaseContract::getSaleContractId, saleContractId)
                        .eq(BamuPurchaseContract::getIsDeleted, DataDeletedStatus.NO.getType())
                        .last("LIMIT 1");

        // 使用构建的查询条件，查询并返回第一个符合条件的采购合同
        return getOne(wrapper);
    }

    /**
     * 根据ID获取采购合同，不包括已删除的记录
     *
     * 此方法用于检索系统中特定的采购合同记录它首先验证提供的ID是否有效，
     * 如果ID无效，直接返回null如果ID有效，方法将查询数据库中与该ID相关联的
     * 采购合同记录，并确保返回的记录是未被标记为删除的这样可以避免返回已逻辑删除的数据
     *
     * @param id 采购合同的唯一标识符
     * @return 如果找到有效的采购合同记录，则返回该记录；如果ID无效或记录不存在，则返回null
     */
    @Override
    public BamuPurchaseContract getByIdNoDelete(String id) {
        // 验证ID有效性
        if (StringUtils.isBlank(id)) {
            return null;
        }
        // 构建查询条件，寻找ID为指定值且未被删除的采购合同记录
        LambdaQueryWrapper<BamuPurchaseContract> wrapper =
                new LambdaQueryWrapper<BamuPurchaseContract>()
                        .eq(BamuPurchaseContract::getId, id)
                        .eq(BamuPurchaseContract::getIsDeleted, DataDeletedStatus.NO.getType());
        // 执行查询并返回结果
        return getOne(wrapper);
    }

    /**
     * 根据合同ID更新合同总数量和总价格
     * 该方法通过计算材料总量和总价格，来更新采购合同中的相关数据
     * 主要用于保持合同数据的一致性和准确性，确保合同总览数据与明细数据相符
     *
     * @param contractId 合同ID，用于定位特定的采购合同
     */
    @Override
    public void updateTotalPriceAndNumByContractId(String contractId) {
        // 获取合同材料总数量
        BigDecimal totalNum = bamuContractMaterialMapper.getTotalNumByContractId(contractId);
        // 获取合同材料总价格
        BigDecimal totalPrice = bamuContractMaterialMapper.getTotalPriceByContractId(contractId);

        // 构造更新条件和更新内容
        LambdaUpdateWrapper<BamuPurchaseContract> wrapper =
                new LambdaUpdateWrapper<BamuPurchaseContract>().eq(BamuPurchaseContract::getId, contractId)
                        .set(BamuPurchaseContract::getContractNum, totalNum)
                        .set(BamuPurchaseContract::getContractTotalPrice, totalPrice);

        // 执行更新操作
        update(wrapper);
    }


    /**
     * 根据合同ID删除信息
     * 此方法覆盖了父类的相应方法，用于处理合同删除逻辑
     * 它首先获取当前用户ID，然后结合一个随机生成的三位数，
     * 一起作为删除操作的标识，调用底层数据映射的deletedById方法完成删除操作
     *
     * @param contractId 合同的唯一标识符，用于定位要删除的合同
     */
    @Override
    public void deletedById(String contractId) {
        // 获取当前用户ID，用于记录删除操作的执行者
        String userId = BaseContext.getUserId();
        // 调用底层数据映射的deletedById方法，传入合同ID、随机生成的三位数和用户ID，完成删除操作
        baseMapper.deletedById(contractId,
                String.valueOf(RandomUtils.generateRandomThreeDigitNumber()),
                userId);
    }

    @Override
    public List<BamuPurchaseContract> listById(String Id) {
        // 检查合同ID是否为空或空白，如果是，则返回一个空列表
        if (StringUtils.isBlank(Id)) {
            return List.of();
        }
        // 创建一个LambdaQueryWrapper用于构建查询条件
        LambdaQueryWrapper<BamuPurchaseContract> wrapper =
                new LambdaQueryWrapper<BamuPurchaseContract>().eq(BamuPurchaseContract::getId,
                        Id).eq(BamuPurchaseContract::getIsDeleted, DataDeletedStatus.NO.getType());
        // 使用构建的查询条件获取并返回关联的材料列表
        return list(wrapper);
    }
}
